const Router = require("koa-router");
const router = new Router();

const { returnMsg, queryFn, jwtVerify } = require("../../utils");
const fs = require("fs");
const multer = require("@koa/multer"); //加载koa-multer模块
const path = require("path");
const moment = require("moment");

//文章列表
router.get("/list", async (ctx) => {
  //得到数据库中到底有多少篇文章(total)
  let sql = `SELECT COUNT(*) ROWS FROM cms_article`;
  let result = await queryFn(sql);
  let total = result[0].ROWS;
  //获取前端传过来的当前页码(current)和每页显示个数(pageSize)
  let { current, pageSize } = ctx.query; //koa获取get参数
  //确以前端传了这两个参数
  if (!current || !pageSize) {
    ctx.body = returnMsg(1, "参数错误");
    return;
  }
  //去数据库查询对应的1e条数据给前端
  /*
  前端是传页码过来的1,2,3,4,5
  第1页的数据：index=0  (current-1)*10=0      ->0~9
  第2页的数据：index=10 (current-1)*10=10     ->10-19
  第3页的数据：index=20 (current-1)*10=20     ->20-29
*/

  let sql2 = `SELECT * FROM cms_article LIMIT ${
    (current - 1) * pageSize
  },${pageSize}`;
  let result2 = await queryFn(sql2);
  ctx.body = returnMsg(0, "分页查询成功", {
    current,
    pageSize,
    total,
    arr: result2,
  });
});

//根据前端传过来的id获取文章
router.post("/list/id", async (ctx) => {
  let token = ctx.request.headers["cms-token"];
  //鉴权
  if (!jwtVerify(token)) {
    ctx.body = returnMsg(2, "查询用户信息失败", "token过期或该用户不存在");
    return;
  }
  //得到前端传过来的id
  let { id } = ctx.request.body;
  //到数据库中搜索id对应的文章
  let sql = `SELECT * FROM cms_article WHERE id=${id}`;
  let result = await queryFn(sql);
  if (result.length > 0) {
    ctx.body = returnMsg(0, "文章修改成功", result[0]);
  } else {
    ctx.body = returnMsg(1, "该文章已不存在");
  }
});

//文章编辑
router.post("/list/edit", async (ctx) => {
  let token = ctx.request.headers["cms-token"];
  //鉴权
  if (!jwtVerify(token)) {
    ctx.body = returnMsg(2, "查询用户信息失败", "token过期或该用户不存在");
    return;
  }
  //额外地从token中获取该用户是否有编辑权限
  let sql2 = `SELECT editable,username FROM cms_user WHERE token='${token}'`;
  let result = await queryFn(sql2);
  if (result[0].editable === 1) {
    //有编辑权限
    let { id, title, subTitle, content } = ctx.request.body;
    //判断必要参数是否有传
    if (!id || !title || !content) {
      ctx.body = returnMsg(1, "参数错误");
      return;
    }
    //查询数据库是否有这篇文章
    let sql = `SELECT * FROM cms_article WHERE id=${id}`;
    let result = await queryFn(sql);
    //得到一个数组,长度>0,代表有这篇文章
    if (result.length > 0) {
      //日期这个值要考虑是前端传过来还是后端自己设置
      let mydate = moment().format("YYYY-MM-DD hh:mm:ss");
      let sql1 = `UPDATE cms_article SET title='${title || ""}',sub_title='${
        subTitle || ""
      }',content='${content || ""}',date='${mydate}',author='${
        result[0].author
      }' WHERE id=${id}`;
      await queryFn(sql1);
      //如果改完了文章

      ctx.body = returnMsg(0, "文章修改成功");
    } else {
      //文章不存在
      ctx.body = returnMsg(1, "当前编辑的文章不存在");
      return;
    }
  } else {
    //没有编辑权限
    ctx.body = returnMsg(1, "该用户没有编辑权限");
    return;
  }

  //假设鉴权成功

  //·重新返回整个文章列表
  ctx.body = returnMsg(0, "文章修改成功");
});

//文章删除
router.post("/delete", async (ctx) => {
  let token = ctx.request.headers["cms-token"];
  //鉴权
  if (!jwtVerify(token)) {
    ctx.body = returnMsg(2, "查询用户信息失败", "token过期或该用户不存在");
    return;
  }
  //获取要删除的文章的id
  let { id } = ctx.request.body;
  if (!id) {
    ctx.body = returnMsg(1, "参数错误");
    return;
  }
  //判断用户是否有删除文章的权限
  let sq12 = `SELECT editable FROM cms_user WHERE token='${token}'`;
  let result2 = await queryFn(sq12);
  if (result2[0].editable === 0) {
    //代表不可以删除
    ctx.body = returnMsg(2, "该用户无删除权限");
    return;
  }
  //判断该文章是否存在
  let sql = `SELECT * FROM cms_article WHERE id=${id}`;
  let result = await queryFn(sql);
  if (result.length == 0) {
    //文章不存在
    ctx.body = returnMsg(2, "删除的文章不存在");
    return;
  }
  //删除文章
  let sql1 = `DELETE FROM cms_article WHERE id=${id}`;
  await queryFn(sql1);
  ctx.body = returnMsg(0, "删除成功");
});

// 文章新增
router.post("/add", async (ctx) => {
  let token = ctx.request.headers["cms-token"];
  //鉴权
  if (!jwtVerify(token)) {
    ctx.body = returnMsg(2, "查询用户信息失败", "token过期或该用户不存在");
    return;
  }
  //额外地从token中获取该用户是否有编辑权限
  let sql2 = `SELECT editable,username FROM cms_user WHERE token='${token}'`;
  let result2 = await queryFn(sql2);
  if (result2[0].editable === 1) {
    //有编辑权限
    let { title, subTitle, content } = ctx.request.body;
    //判断必要参数是否有传
    if (!title || !content) {
      ctx.body = returnMsg(1, "参数错误");
      return;
    }

    //日期这个值要考虑是前端传过来还是后端自己设置
    let mydate = moment().format("YYYY-MM-DD hh:mm:ss");
    let sql1 = `INSERT INTO cms_article VALUES (null,'${title}','${subTitle}','${result2[0].author}','${mydate}','${content}')`;
    await queryFn(sql1);
    //如果改完了文章

    ctx.body = returnMsg(0, "文章新增成功");
  } else {
    //没有编辑权限
    ctx.body = returnMsg(1, "该用户没有编辑权限");
    return;
  }
});

// 文章新增模拟数据 postman调一下作为测试数据
router.get("/addall", async (ctx) => {
  for (let i = 0; i < 100; i++) {
    let sql = `INSERT INTO cms_article VALUES (null,'你好${i}','世界${i}','yu','${moment().format(
      "YYYY-MM-DD"
    )}', '<p>内容${i}</>')`;
    await queryFn(sql);
  }
  ctx.body = 123;
});
module.exports = router;

/* 
【文章编辑】
0、鉴权
1、前端传文章的id过来
2、到数据库查找对应id的文章
3,title,subTitle,content,date,author字段全改



【分页逻辑】
+前端做分页 尽量不做
+后端做分页
    1、直接从数据库查询所有文章,得到一个数组
    2、按照前端指定的页数和每页数量,切割好数组,返回对应的数据3、这些数据要返回给前端：当前第几页、每页几条数据、总共几条数据、总共几页、切割好的数组
+.前端请求后端处理好的分页
    1、传当前页码,和每页显示数量
*/
